/*
 * To change this template, choose Tools | Templates
 * and open the template in the editor.
 */
package com.controller;

import com.algoritmo.AGPrincipal;
import com.persistencia.domain.*;
import com.service.*;
import com.service.impl.*;
import java.io.FileInputStream;
import java.io.FileNotFoundException;
import java.io.InputStream;
import java.io.Serializable;
import java.math.BigDecimal;
import java.util.ArrayList;
import java.util.HashMap;
import java.util.List;
import java.util.logging.Level;
import java.util.logging.Logger;
import javax.faces.application.FacesMessage;
import javax.faces.bean.ManagedBean;
import javax.faces.bean.ViewScoped;
import javax.faces.context.FacesContext;
import org.primefaces.context.RequestContext;
import org.primefaces.model.DefaultStreamedContent;
import org.primefaces.model.StreamedContent;

/**
 *
 * @author kenny
 */
@ManagedBean
@ViewScoped
public class AlgoritmoController implements Serializable{

    /**
     * Creates a new instance of AlgoritmoController
     */
    AGPrincipal agPrincipal;
    private AsignaturaXPeriodoService asignaturaXPeriodoService;
    private PeriodoXSalonService periodoxSalonService;
    private Horario horario;
    private Horario horarioseleccionado;
    private Periodoxsalon periodoxsalon;
    private List<Periodoxsalon> listaperiodoxsalon;
    private SalonService salonService;
    private CicloxPeriodoService cicloxPeriodoService;
    private HorarioService horarioService;
    private List<Horario> listahorario;
    private Cicloxperiodo cicloxperiodo;
    private Cicloxperiodo cicloxperiodoseleccionado;
    private Cicloacademico cicloacademico;
    private List<Salon> listaSalon;
    
    private PeriodoService periodoService;
    private List<Periodo> listaPeriodo;
    
    private HashMap<Integer, HashMap<Integer, Docentexclase>> individuo;
    private List<HashMap<Integer, HashMap<Integer, Docentexclase>>> listaHorarios;
    
    HashMap<Integer, HashMap<Integer, Docentexclase>> listaHMHorarioSalon;
    HashMap<Integer, Docentexclase> listaHMHorarioPeriodo;
    private DocentexClaseService docentexClaseService;
    private List<Docentexclase> listaDocentexClase;
    
    
    public String tamanoPoblacion = "0";
    public String probCruzamiento = "0";
    public String probMutacion = "0";    
    public String cantIteracion = "0";
    public String horasMaxClaseConsXDia = "0";    
    public String horasMaxClaseTotalXDia = "0"; 
    
    private String matrizHorario[][] = new String [33][84];
   
    private String funciondeadaptacion ="100";
    private String ciclo1ini = "";
    private String ciclo1fin = "";
    private String ciclo1sabini = "";
    private String ciclo1sabfin = "";
    private String ciclo2ini = "";
    private String ciclo2fin = "";
    private String ciclo2sabini = "";
    private String ciclo2sabfin = "";
    private String ciclo3ini = "";
    private String ciclo3fin = "";
    private String ciclo3sabini = "";
    private String ciclo3sabfin = "";
    private String ciclo4ini = "";
    private String ciclo4fin = "";
    private String ciclo4sabini = "";
    private String ciclo4sabfin = "";
    private String ciclo5ini = "";
    private String ciclo5fin = "";
    private String ciclo5sabini = "";
    private String ciclo5sabfin = "";
    private String ciclo6ini = "";
    private String ciclo6fin = "";
    private String ciclo6sabini = "";
    private String ciclo6sabfin = "";
    private String ciclo7ini = "";
    private String ciclo7fin = "";
    private String ciclo7sabini = "";
    private String ciclo7sabfin = "";
    private String ciclo8ini = "";
    private String ciclo8fin = "";
    private String ciclo8sabini = "";
    private String ciclo8sabfin = "";
    private String ciclo9ini = "";
    private String ciclo9fin = "";
    private String ciclo9sabini = "";
    private String ciclo9sabfin = "";
    private String ciclo10ini = "";
    private String ciclo10fin = "";
    private String ciclo10sabini = "";
    private String ciclo10sabfin = "";
    
    Constantes constantes;
    
    public AlgoritmoController() {
        try {
            agPrincipal = new AGPrincipal();
            salonService = new SalonServiceImpl();
            listaSalon = new ArrayList<Salon>(); 
            periodoService = new PeriodoServiceImpl();
            periodoxSalonService = new PeriodoXSalonServiceImpl();
            listaPeriodo = new ArrayList<Periodo>();
            listaperiodoxsalon = new ArrayList<Periodoxsalon>();
            listaSalon = salonService.obtenerListaSalon();
            listaPeriodo =  periodoService.obtenerListaPeriodo();
            
            cicloxPeriodoService = new CicloxPeriodoServiceImpl();
            
            horario = new Horario();
            horarioseleccionado = new Horario();
            listahorario = new ArrayList<Horario>();
            horarioService = new HorarioServiceImpl();
            listahorario= horarioService.obtenerListaHorario();
            periodoxsalon = new Periodoxsalon();                    
            
            cicloxperiodo = new Cicloxperiodo();
            cicloacademico = new Cicloacademico();
            cicloxperiodoseleccionado = new Cicloxperiodo();
            asignaturaXPeriodoService = new AsignaturaXPeriodoServiceImpl();
            individuo = new HashMap<Integer, HashMap<Integer, Docentexclase>>();
            docentexClaseService = new DocentexClaseServiceImpl();
            listaDocentexClase = new ArrayList<Docentexclase>();
            listaDocentexClase = docentexClaseService.obtenerListaDocenteXClasePorCiclo(new Ciclo(1));

            constantes = new Constantes();
            cargarcicloxperiodo();
            System.out.println("Entramos a comsultar a la base de datos");
        } catch (Exception ex) {
            Logger.getLogger(AlgoritmoController.class.getName()).log(Level.SEVERE, null, ex);
        }
        
    }
    
    public void generarHorario(){
        agPrincipal.algoritmoGenetico();
        matrizHorario = agPrincipal.getMatrizHorario();
        
        System.out.println("Aqui funcion objetivo:"+agPrincipal.getVfunciondeadaptacion());
        funciondeadaptacion=""+agPrincipal.getvFuncionAptitud();
        //RequestContext.getCurrentInstance().update("formHorario:listahorario");
    }
    
    public void cargarcicloxperiodo(){
        
        System.out.println("Entramos");
        try {
            cicloxperiodoseleccionado = cicloxPeriodoService.obtenerCicloxperiodoPorId(1);
            ciclo1ini = ""+cicloxperiodoseleccionado.getNCicHoraIni();
            ciclo1fin = ""+cicloxperiodoseleccionado.getNCicHoraFin();
            ciclo1sabini = ""+cicloxperiodoseleccionado.getNCicSabHoraIni();
            ciclo1sabfin = ""+cicloxperiodoseleccionado.getNCicSabHoraFin();
            
            cicloxperiodoseleccionado = cicloxPeriodoService.obtenerCicloxperiodoPorId(2);
            ciclo2ini = ""+cicloxperiodoseleccionado.getNCicHoraIni();
            ciclo2fin = ""+cicloxperiodoseleccionado.getNCicHoraFin();
            ciclo2sabini = ""+cicloxperiodoseleccionado.getNCicSabHoraIni();
            ciclo2sabfin = ""+cicloxperiodoseleccionado.getNCicSabHoraFin();
            
            cicloxperiodoseleccionado = cicloxPeriodoService.obtenerCicloxperiodoPorId(3);
            ciclo3ini = ""+cicloxperiodoseleccionado.getNCicHoraIni();
            ciclo3fin = ""+cicloxperiodoseleccionado.getNCicHoraFin();
            ciclo3sabini = ""+cicloxperiodoseleccionado.getNCicSabHoraIni();
            ciclo3sabfin = ""+cicloxperiodoseleccionado.getNCicSabHoraFin();
            
            
            cicloxperiodoseleccionado = cicloxPeriodoService.obtenerCicloxperiodoPorId(4);
            ciclo4ini = ""+cicloxperiodoseleccionado.getNCicHoraIni();
            ciclo4fin = ""+cicloxperiodoseleccionado.getNCicHoraFin();
            ciclo4sabini = ""+cicloxperiodoseleccionado.getNCicSabHoraIni();
            ciclo4sabfin = ""+cicloxperiodoseleccionado.getNCicSabHoraFin();
            
            
            cicloxperiodoseleccionado = cicloxPeriodoService.obtenerCicloxperiodoPorId(5);
            ciclo5ini = ""+cicloxperiodoseleccionado.getNCicHoraIni();
            ciclo5fin = ""+cicloxperiodoseleccionado.getNCicHoraFin();
            ciclo5sabini = ""+cicloxperiodoseleccionado.getNCicSabHoraIni();
            ciclo5sabfin = ""+cicloxperiodoseleccionado.getNCicSabHoraFin();
            
            
            cicloxperiodoseleccionado = cicloxPeriodoService.obtenerCicloxperiodoPorId(6);
            ciclo6ini = ""+cicloxperiodoseleccionado.getNCicHoraIni();
            ciclo6fin = ""+cicloxperiodoseleccionado.getNCicHoraFin();
            ciclo6sabini = ""+cicloxperiodoseleccionado.getNCicSabHoraIni();
            ciclo6sabfin = ""+cicloxperiodoseleccionado.getNCicSabHoraFin();
            
            
            cicloxperiodoseleccionado = cicloxPeriodoService.obtenerCicloxperiodoPorId(7);
            ciclo7ini = ""+cicloxperiodoseleccionado.getNCicHoraIni();
            ciclo7fin = ""+cicloxperiodoseleccionado.getNCicHoraFin();
            ciclo7sabini = ""+cicloxperiodoseleccionado.getNCicSabHoraIni();
            ciclo7sabfin = ""+cicloxperiodoseleccionado.getNCicSabHoraFin();
            
            
            cicloxperiodoseleccionado = cicloxPeriodoService.obtenerCicloxperiodoPorId(8);
            ciclo8ini = ""+cicloxperiodoseleccionado.getNCicHoraIni();
            ciclo8fin = ""+cicloxperiodoseleccionado.getNCicHoraFin();
            ciclo8sabini = ""+cicloxperiodoseleccionado.getNCicSabHoraIni();
            ciclo8sabfin = ""+cicloxperiodoseleccionado.getNCicSabHoraFin();
            
            
            cicloxperiodoseleccionado = cicloxPeriodoService.obtenerCicloxperiodoPorId(9);
            ciclo9ini = ""+cicloxperiodoseleccionado.getNCicHoraIni();
            ciclo9fin = ""+cicloxperiodoseleccionado.getNCicHoraFin();
            ciclo9sabini = ""+cicloxperiodoseleccionado.getNCicSabHoraIni();
            ciclo9sabfin = ""+cicloxperiodoseleccionado.getNCicSabHoraFin();
            
            cicloxperiodoseleccionado = cicloxPeriodoService.obtenerCicloxperiodoPorId(10);
            ciclo10ini = ""+cicloxperiodoseleccionado.getNCicHoraIni();
            ciclo10fin = ""+cicloxperiodoseleccionado.getNCicHoraFin();
            ciclo10sabini = ""+cicloxperiodoseleccionado.getNCicSabHoraIni();
            ciclo10sabfin = ""+cicloxperiodoseleccionado.getNCicSabHoraFin();
            
        } catch (Exception ex) {
            Logger.getLogger(AlgoritmoController.class.getName()).log(Level.SEVERE, null, ex);
        }
    }
    
     public void guardarcicloxperiodo(){
        try {
            System.out.println("Entramos a crear docente");
           
            cicloacademico.setNCicAcdId(1);
            cicloxperiodo.setCicloacademico(cicloacademico);
            cicloxperiodo.setNCicAcdId(1);
            cicloxperiodo.setNCicHoraIni(Integer.parseInt(ciclo1ini));
            cicloxperiodo.setNCicHoraFin(Integer.parseInt(ciclo1fin));
            cicloxperiodo.setNCicSabHoraIni(Integer.parseInt(ciclo1sabini));
            cicloxperiodo.setNCicSabHoraFin(Integer.parseInt(ciclo1sabfin));
            cicloxPeriodoService.actualizarCicloxperiodo(cicloxperiodo);
            
            cicloacademico.setNCicAcdId(2);
            cicloxperiodo.setCicloacademico(cicloacademico);
            cicloxperiodo.setNCicAcdId(2);
            cicloxperiodo.setNCicHoraIni(Integer.parseInt(ciclo2ini));
            cicloxperiodo.setNCicHoraFin(Integer.parseInt(ciclo2fin));
            cicloxperiodo.setNCicSabHoraIni(Integer.parseInt(ciclo2sabini));
            cicloxperiodo.setNCicSabHoraFin(Integer.parseInt(ciclo2sabfin));
            cicloxPeriodoService.actualizarCicloxperiodo(cicloxperiodo);
            
            cicloacademico.setNCicAcdId(3);
            cicloxperiodo.setCicloacademico(cicloacademico);
            cicloxperiodo.setNCicAcdId(3);
            cicloxperiodo.setNCicHoraIni(Integer.parseInt(ciclo3ini));
            cicloxperiodo.setNCicHoraFin(Integer.parseInt(ciclo3fin));
            cicloxperiodo.setNCicSabHoraIni(Integer.parseInt(ciclo3sabini));
            cicloxperiodo.setNCicSabHoraFin(Integer.parseInt(ciclo3sabfin));
            cicloxPeriodoService.actualizarCicloxperiodo(cicloxperiodo);
            
            cicloacademico.setNCicAcdId(4);
            cicloxperiodo.setCicloacademico(cicloacademico);
            cicloxperiodo.setNCicAcdId(4);
            cicloxperiodo.setNCicHoraIni(Integer.parseInt(ciclo4ini));
            cicloxperiodo.setNCicHoraFin(Integer.parseInt(ciclo4fin));
            cicloxperiodo.setNCicSabHoraIni(Integer.parseInt(ciclo4sabini));
            cicloxperiodo.setNCicSabHoraFin(Integer.parseInt(ciclo4sabfin));
            cicloxPeriodoService.actualizarCicloxperiodo(cicloxperiodo);
            
            cicloacademico.setNCicAcdId(5);
            cicloxperiodo.setCicloacademico(cicloacademico);
            cicloxperiodo.setNCicAcdId(5);
            cicloxperiodo.setNCicHoraIni(Integer.parseInt(ciclo5ini));
            cicloxperiodo.setNCicHoraFin(Integer.parseInt(ciclo5fin));
            cicloxperiodo.setNCicSabHoraIni(Integer.parseInt(ciclo5sabini));
            cicloxperiodo.setNCicSabHoraFin(Integer.parseInt(ciclo5sabfin));
            cicloxPeriodoService.actualizarCicloxperiodo(cicloxperiodo);
            
            cicloacademico.setNCicAcdId(6);
            cicloxperiodo.setCicloacademico(cicloacademico);
            cicloxperiodo.setNCicAcdId(6);
            cicloxperiodo.setNCicHoraIni(Integer.parseInt(ciclo6ini));
            cicloxperiodo.setNCicHoraFin(Integer.parseInt(ciclo6fin));
            cicloxperiodo.setNCicSabHoraIni(Integer.parseInt(ciclo6sabini));
            cicloxperiodo.setNCicSabHoraFin(Integer.parseInt(ciclo6sabfin));
            cicloxPeriodoService.actualizarCicloxperiodo(cicloxperiodo);
            
            cicloacademico.setNCicAcdId(7);
            cicloxperiodo.setCicloacademico(cicloacademico);
            cicloxperiodo.setNCicAcdId(7);
            cicloxperiodo.setNCicHoraIni(Integer.parseInt(ciclo7ini));
            cicloxperiodo.setNCicHoraFin(Integer.parseInt(ciclo7fin));
            cicloxperiodo.setNCicSabHoraIni(Integer.parseInt(ciclo7sabini));
            cicloxperiodo.setNCicSabHoraFin(Integer.parseInt(ciclo7sabfin));
            cicloxPeriodoService.actualizarCicloxperiodo(cicloxperiodo);
            
            cicloacademico.setNCicAcdId(8);
            cicloxperiodo.setCicloacademico(cicloacademico);
            cicloxperiodo.setNCicAcdId(8);
            cicloxperiodo.setNCicHoraIni(Integer.parseInt(ciclo8ini));
            cicloxperiodo.setNCicHoraFin(Integer.parseInt(ciclo8fin));
            cicloxperiodo.setNCicSabHoraIni(Integer.parseInt(ciclo8sabini));
            cicloxperiodo.setNCicSabHoraFin(Integer.parseInt(ciclo8sabfin));
            cicloxPeriodoService.actualizarCicloxperiodo(cicloxperiodo);
            
            cicloacademico.setNCicAcdId(9);
            cicloxperiodo.setCicloacademico(cicloacademico);
            cicloxperiodo.setNCicAcdId(9);
            cicloxperiodo.setNCicHoraIni(Integer.parseInt(ciclo9ini));
            cicloxperiodo.setNCicHoraFin(Integer.parseInt(ciclo9fin));
            cicloxperiodo.setNCicSabHoraIni(Integer.parseInt(ciclo9sabini));
            cicloxperiodo.setNCicSabHoraFin(Integer.parseInt(ciclo9sabfin));
            cicloxPeriodoService.actualizarCicloxperiodo(cicloxperiodo);
            
            cicloacademico.setNCicAcdId(10);
            cicloxperiodo.setCicloacademico(cicloacademico);
            cicloxperiodo.setNCicAcdId(10);
            cicloxperiodo.setNCicHoraIni(Integer.parseInt(ciclo10ini));
            cicloxperiodo.setNCicHoraFin(Integer.parseInt(ciclo10fin));
            cicloxperiodo.setNCicSabHoraIni(Integer.parseInt(ciclo10sabini));
            cicloxperiodo.setNCicSabHoraFin(Integer.parseInt(ciclo10sabfin));
            cicloxPeriodoService.actualizarCicloxperiodo(cicloxperiodo);
            
            asignaturaXPeriodoService.actualizarAsignaturaXPeriodo();
            
            FacesMessage msg = new FacesMessage("Se actualizo los Peridos de las Asignaturas por Ciclo");
            FacesContext.getCurrentInstance().addMessage(null, msg);
        } catch (Exception ex) {
            Logger.getLogger(DocenteController.class.getName()).log(Level.SEVERE, null, ex);
        }
    }
     
    public void guardarperiodoxsalon(){
        try {
            int indicemejorsol = 0;
            indicemejorsol=agPrincipal.getIndicemejorsolucion();
            listaHorarios = agPrincipal.getListaHorarios();
            horario = new Horario();
            horario.setNFncAptitud(Integer.parseInt(funciondeadaptacion));
            horario.setNCntIteracion(Integer.parseInt(constantes.getCantIteracion()));
            horario.setNTmnPoblacion(Integer.parseInt(constantes.getTamanoPoblacion()));
            horario.setNPrbCruce(new BigDecimal(constantes.getProbCruzamiento()));
            horario.setNPrbMutacion(new BigDecimal(constantes.getProbMutacion()));
            horario.setNMaxHorCnsDia(Integer.parseInt(constantes.getHorasMaxClaseConsXDia()));
            horario.setNMaxHorClsDia(Integer.parseInt(constantes.getHorasMaxClaseTotalXDia()));
            horario.setVEstado("1");
            horarioService.registrarHorario(horario);
            int indice = horarioService.horarioMaxId();
            System.out.println("IndiceMaxHorario:"+indice);
            System.out.println("Indice mejor solucion:"+indicemejorsol);
            System.out.println("tamanio de salon:"+listaSalon.size());
            System.out.println("tamanio de periodo:"+listaPeriodo.size());
            for (int i=0; i<listaSalon.size(); i++ ) {
                for (int j=0; j<listaPeriodo.size(); j++) {
                    System.out.println("Mejor solucion:"+indicemejorsol+"Tamanio de Lista Horario:"+listaHorarios.size());
                    Docentexclase docenteXClase = listaHorarios.get(indicemejorsol).get(listaSalon.get(i).getNSlnId()).get(listaPeriodo.get(j).getNPrdId());
                    if(docenteXClase!=null){
                        System.out.println("Entramos insertar");
                        horario = horarioService.obtenerHorarioPorId(indice);
                        periodoxsalon = new Periodoxsalon();
                        periodoxsalon.setNDcnClsId(docenteXClase);
                        periodoxsalon.setNHorId(horario);
                        periodoxsalon.setNPrdId(listaPeriodo.get(j));
                        periodoxsalon.setSlnId(listaSalon.get(i));
                        periodoxsalon.setVEstado("1");
                        periodoxSalonService.registrarPeriodoXSalon(periodoxsalon);  
                    }
                    
                    
                    
  
                }
            }
            listahorario = horarioService.obtenerListaHorario();
            System.out.println("Entramos a guardar");
            FacesContext context = FacesContext.getCurrentInstance();           
            context.addMessage(null, new FacesMessage("Exito Se registro el horario", ""));
            //RequestContext.getCurrentInstance().update("form:panellista");
            /*FacesMessage msg = new FacesMessage("Se registro el horario");
            FacesContext.getCurrentInstance().addMessage(null, msg);*/
            
            
            
            
        } catch (Exception ex) {
            Logger.getLogger(AlgoritmoController.class.getName()).log(Level.SEVERE, null, ex);
        }
    } 
     
    public void cargarhorario(){
        try {
            individuo = inicializarHorario();
            System.out.println("Individuo :"+individuo.size());
            //individuo.size();
            //listaperiodoxsalon = periodoxSalonService.obtenerListaPeriodoXSalon();
            
            listaperiodoxsalon = periodoxSalonService.buscarperiodoxsalonxIdHorario(horarioseleccionado);
            /*for (int i=0; i<listaSalon.size(); i++ ) {
                for (int j=0; j<listaPeriodo.size(); j++) {
                    //System.out.println("Insertamos");
                    Docentexclase docenteXClase = individuo.get(listaSalon.get(i).getNSlnId()).get(listaPeriodo.get(j).getNPrdId());
                    if(docenteXClase!=null){
                        System.out.println(""+docenteXClase.getNClsId().getNAsgId().getVNombre());
                    }
                }
            }*/
            for(int i=0; i<listaperiodoxsalon.size(); i++){
                //System.out.println("SalonxPeriodo:"+listaperiodoxsalon.get(i).getNPrdSlnId()+"Id Salon:"+listaperiodoxsalon.get(i).getSlnId().getNSlnId());
                //System.out.println("Periodo:"+listaperiodoxsalon.get(i).getNPrdId().getNPrdId()+" DocentexClase:"+listaperiodoxsalon.get(i).getNDcnClsId().getNDcnClsId());
                //System.out.println("Id Salon:"+listaperiodoxsalon.get(i).getSlnId().getNSlnId());
                individuo.get(listaperiodoxsalon.get(i).getSlnId().getNSlnId()).put(listaperiodoxsalon.get(i).getNPrdId().getNPrdId(), listaperiodoxsalon.get(i).getNDcnClsId());
            }
            
            /*for (int i=0; i<listaSalon.size(); i++ ) {
                for (int j=0; j<listaPeriodo.size(); j++) {
                    System.out.println("Insertamos");
                    Docentexclase docenteXClase = individuo.get(listaSalon.get(i).getNSlnId()).get(listaPeriodo.get(j).getNPrdId());
                    if(docenteXClase!=null){
                        System.out.println(""+docenteXClase.getNClsId().getNAsgId().getVNombre());
                    }
                }
            }*/
            
            int contfilas;
        int contcolumnas = 1;
        //Se guardará el horario con mejor FA
        for ( Periodo periodo : listaPeriodo ) {
            contfilas = 1;
            //contcolumnas = 1;
            for (Salon salon : listaSalon ) {
                    //Docentexclase docenteXClase = listaHorarioSalon.get(salon.getNSlnId()).get(periodo.getNPrdId());
                    Docentexclase docenteXClase = individuo.get(salon.getNSlnId()).get(periodo.getNPrdId());
                    if( docenteXClase == null ){
                        //System.out.println("null"+",("+contfilas+","+contcolumnas+")");
                        matrizHorario[contfilas-1][contcolumnas-1]= "";
                    }else{ 
                        //System.out.println(docenteXClase.getNClsId().getNAsgId().getVNombre()+",("+contfilas+","+contcolumnas+")");
                        matrizHorario[contfilas-1][contcolumnas-1]= docenteXClase.getNClsId().getNAsgId().getVNombre() +","+docenteXClase.getNClsId().getNMdlDctId().getVNombre();
                    }
                    contfilas++;
                }
                contcolumnas++;
            } 
            FacesContext context = FacesContext.getCurrentInstance();           
            context.addMessage(null, new FacesMessage("Exito", "Se cargo el horario exitosamente"));
            /*FacesMessage msg = new FacesMessage("Se cargo el horario exitosamente");
            FacesContext.getCurrentInstance().addMessage(null, msg);*/
        } catch (Exception ex) {
            Logger.getLogger(AlgoritmoController.class.getName()).log(Level.SEVERE, null, ex);
        }
        
    }
    
    public HashMap<Integer, HashMap<Integer, Docentexclase>> inicializarHorario(){
        listaHMHorarioSalon = new HashMap<Integer, HashMap<Integer, Docentexclase>>();        
        for (Salon salon : listaSalon) {
            listaHMHorarioPeriodo = new HashMap<Integer, Docentexclase>();
            for (Periodo periodo : listaPeriodo) {
                listaHMHorarioPeriodo.put(periodo.getNPrdId(), null);
            }
            listaHMHorarioSalon.put(salon.getNSlnId(), listaHMHorarioPeriodo);                
        }
        return listaHMHorarioSalon;
    }
    
     public StreamedContent descargarhorario(){
                cargarhorario();
                StreamedContent file;
                
                file = agPrincipal.descargarhorario(matrizHorario, listaSalon, listaPeriodo);
                return file;
                
    }
     
    public StreamedContent descargarhorarioxSalon(){
                cargarhorario();
                StreamedContent file;
                int indice = 0;
                //indice=agPrincipal.getIndicemejorsolucion();
                file = agPrincipal.descargarhorarioxsalon(individuo, listaSalon, listaPeriodo);
                return file;
                
    }
    
    public StreamedContent descargarpdf(){
                cargarhorario();
                StreamedContent file;
                int indice = 0;
                //indice=agPrincipal.getIndicemejorsolucion();
                file = agPrincipal.descargarpdf(individuo, listaSalon, listaPeriodo, listaDocentexClase);
                return file;
                
    }
    
   

    public List<Salon> getListaSalon() {
        return listaSalon;
    }

    public void setListaSalon(List<Salon> listaSalon) {
        this.listaSalon = listaSalon;
    }

    public String[][] getMatrizHorario() {
        return matrizHorario;
    }

    public void setMatrizHorario(String[][] matrizHorario) {
        this.matrizHorario = matrizHorario;
    }

    public String getFunciondeadaptacion() {
        
        
        /*matrizHorario = agPrincipal.getMatrizHorario();
        System.out.println("Aqui:"+agPrincipal.getVfunciondeadaptacion());
        funciondeadaptacion=""+agPrincipal.getVfunciondeadaptacion();*/
        return funciondeadaptacion;
    }

    public void setFunciondeadaptacion(String funciondeadaptacion) {
        this.funciondeadaptacion = funciondeadaptacion;
    }

    public String getCiclo10fin() {
        return ciclo10fin;
    }

    public void setCiclo10fin(String ciclo10fin) {
        this.ciclo10fin = ciclo10fin;
    }

    public String getCiclo10ini() {
        return ciclo10ini;
    }

    public void setCiclo10ini(String ciclo10ini) {
        this.ciclo10ini = ciclo10ini;
    }

    public String getCiclo10sabfin() {
        return ciclo10sabfin;
    }

    public void setCiclo10sabfin(String ciclo10sabfin) {
        this.ciclo10sabfin = ciclo10sabfin;
    }

    public String getCiclo10sabini() {
        return ciclo10sabini;
    }

    public void setCiclo10sabini(String ciclo10sabini) {
        this.ciclo10sabini = ciclo10sabini;
    }

    public String getCiclo1fin() {
        return ciclo1fin;
    }

    public void setCiclo1fin(String ciclo1fin) {
        this.ciclo1fin = ciclo1fin;
    }

    public String getCiclo1ini() {
        return ciclo1ini;
    }

    public void setCiclo1ini(String ciclo1ini) {
        this.ciclo1ini = ciclo1ini;
    }

    public String getCiclo1sabfin() {
        return ciclo1sabfin;
    }

    public void setCiclo1sabfin(String ciclo1sabfin) {
        this.ciclo1sabfin = ciclo1sabfin;
    }

    public String getCiclo1sabini() {
        return ciclo1sabini;
    }

    public void setCiclo1sabini(String ciclo1sabini) {
        this.ciclo1sabini = ciclo1sabini;
    }

    public String getCiclo2fin() {
        return ciclo2fin;
    }

    public void setCiclo2fin(String ciclo2fin) {
        this.ciclo2fin = ciclo2fin;
    }

    public String getCiclo2ini() {
        return ciclo2ini;
    }

    public void setCiclo2ini(String ciclo2ini) {
        this.ciclo2ini = ciclo2ini;
    }

    public String getCiclo2sabfin() {
        return ciclo2sabfin;
    }

    public void setCiclo2sabfin(String ciclo2sabfin) {
        this.ciclo2sabfin = ciclo2sabfin;
    }

    public String getCiclo2sabini() {
        return ciclo2sabini;
    }

    public void setCiclo2sabini(String ciclo2sabini) {
        this.ciclo2sabini = ciclo2sabini;
    }

    public String getCiclo3fin() {
        return ciclo3fin;
    }

    public void setCiclo3fin(String ciclo3fin) {
        this.ciclo3fin = ciclo3fin;
    }

    public String getCiclo3ini() {
        return ciclo3ini;
    }

    public void setCiclo3ini(String ciclo3ini) {
        this.ciclo3ini = ciclo3ini;
    }

    public String getCiclo3sabfin() {
        return ciclo3sabfin;
    }

    public void setCiclo3sabfin(String ciclo3sabfin) {
        this.ciclo3sabfin = ciclo3sabfin;
    }

    public String getCiclo3sabini() {
        return ciclo3sabini;
    }

    public void setCiclo3sabini(String ciclo3sabini) {
        this.ciclo3sabini = ciclo3sabini;
    }

    public String getCiclo4fin() {
        return ciclo4fin;
    }

    public void setCiclo4fin(String ciclo4fin) {
        this.ciclo4fin = ciclo4fin;
    }

    public String getCiclo4ini() {
        return ciclo4ini;
    }

    public void setCiclo4ini(String ciclo4ini) {
        this.ciclo4ini = ciclo4ini;
    }

    public String getCiclo4sabfin() {
        return ciclo4sabfin;
    }

    public void setCiclo4sabfin(String ciclo4sabfin) {
        this.ciclo4sabfin = ciclo4sabfin;
    }

    public String getCiclo4sabini() {
        return ciclo4sabini;
    }

    public void setCiclo4sabini(String ciclo4sabini) {
        this.ciclo4sabini = ciclo4sabini;
    }

    public String getCiclo5fin() {
        return ciclo5fin;
    }

    public void setCiclo5fin(String ciclo5fin) {
        this.ciclo5fin = ciclo5fin;
    }

    public String getCiclo5ini() {
        return ciclo5ini;
    }

    public void setCiclo5ini(String ciclo5ini) {
        this.ciclo5ini = ciclo5ini;
    }

    public String getCiclo5sabfin() {
        return ciclo5sabfin;
    }

    public void setCiclo5sabfin(String ciclo5sabfin) {
        this.ciclo5sabfin = ciclo5sabfin;
    }

    public String getCiclo5sabini() {
        return ciclo5sabini;
    }

    public void setCiclo5sabini(String ciclo5sabini) {
        this.ciclo5sabini = ciclo5sabini;
    }

    public String getCiclo6fin() {
        return ciclo6fin;
    }

    public void setCiclo6fin(String ciclo6fin) {
        this.ciclo6fin = ciclo6fin;
    }

    public String getCiclo6ini() {
        return ciclo6ini;
    }

    public void setCiclo6ini(String ciclo6ini) {
        this.ciclo6ini = ciclo6ini;
    }

    public String getCiclo6sabfin() {
        return ciclo6sabfin;
    }

    public void setCiclo6sabfin(String ciclo6sabfin) {
        this.ciclo6sabfin = ciclo6sabfin;
    }

    public String getCiclo6sabini() {
        return ciclo6sabini;
    }

    public void setCiclo6sabini(String ciclo6sabini) {
        this.ciclo6sabini = ciclo6sabini;
    }

    public String getCiclo7fin() {
        return ciclo7fin;
    }

    public void setCiclo7fin(String ciclo7fin) {
        this.ciclo7fin = ciclo7fin;
    }

    public String getCiclo7ini() {
        return ciclo7ini;
    }

    public void setCiclo7ini(String ciclo7ini) {
        this.ciclo7ini = ciclo7ini;
    }

    public String getCiclo7sabfin() {
        return ciclo7sabfin;
    }

    public void setCiclo7sabfin(String ciclo7sabfin) {
        this.ciclo7sabfin = ciclo7sabfin;
    }

    public String getCiclo7sabini() {
        return ciclo7sabini;
    }

    public void setCiclo7sabini(String ciclo7sabini) {
        this.ciclo7sabini = ciclo7sabini;
    }

    public String getCiclo8fin() {
        return ciclo8fin;
    }

    public void setCiclo8fin(String ciclo8fin) {
        this.ciclo8fin = ciclo8fin;
    }

    public String getCiclo8ini() {
        return ciclo8ini;
    }

    public void setCiclo8ini(String ciclo8ini) {
        this.ciclo8ini = ciclo8ini;
    }

    public String getCiclo8sabfin() {
        return ciclo8sabfin;
    }

    public void setCiclo8sabfin(String ciclo8sabfin) {
        this.ciclo8sabfin = ciclo8sabfin;
    }

    public String getCiclo8sabini() {
        return ciclo8sabini;
    }

    public void setCiclo8sabini(String ciclo8sabini) {
        this.ciclo8sabini = ciclo8sabini;
    }

    public String getCiclo9fin() {
        return ciclo9fin;
    }

    public void setCiclo9fin(String ciclo9fin) {
        this.ciclo9fin = ciclo9fin;
    }

    public String getCiclo9ini() {
        return ciclo9ini;
    }

    public void setCiclo9ini(String ciclo9ini) {
        this.ciclo9ini = ciclo9ini;
    }

    public String getCiclo9sabfin() {
        return ciclo9sabfin;
    }

    public void setCiclo9sabfin(String ciclo9sabfin) {
        this.ciclo9sabfin = ciclo9sabfin;
    }

    public String getCiclo9sabini() {
        return ciclo9sabini;
    }

    public void setCiclo9sabini(String ciclo9sabini) {
        this.ciclo9sabini = ciclo9sabini;
    }

    public List<Horario> getListahorario() {
        return listahorario;
    }

    public void setListahorario(List<Horario> listahorario) {
        this.listahorario = listahorario;
    }

    public Horario getHorarioseleccionado() {
        return horarioseleccionado;
    }

    public void setHorarioseleccionado(Horario horarioseleccionado) {
        System.out.println("horarioseleccionado");
        this.horarioseleccionado = horarioseleccionado;
        tamanoPoblacion = ""+horarioseleccionado.getNTmnPoblacion();
        probCruzamiento = ""+horarioseleccionado.getNPrbCruce();
        probMutacion = ""+horarioseleccionado.getNPrbMutacion();    
        cantIteracion = ""+horarioseleccionado.getNCntIteracion();
        horasMaxClaseConsXDia = ""+horarioseleccionado.getNMaxHorCnsDia();    
        horasMaxClaseTotalXDia = ""+horarioseleccionado.getNMaxHorClsDia();
        funciondeadaptacion = ""+horarioseleccionado.getNFncAptitud();
        /*System.out.println("Tamanio:"+tamanoPoblacion);
        System.out.println("ProbCruza:"+probCruzamiento);
        System.out.println("ProbMuta:"+probMutacion);
        System.out.println("Cantidad:"+cantIteracion);
        System.out.println("HorasCons:"+horasMaxClaseConsXDia);
        System.out.println("HorasMax:"+horasMaxClaseTotalXDia);*/
        cargarhorario();
        
    }

    public String getCantIteracion() {
        return cantIteracion;
    }

    public void setCantIteracion(String cantIteracion) {
        this.cantIteracion = cantIteracion;
    }

    public String getHorasMaxClaseConsXDia() {
        return horasMaxClaseConsXDia;
    }

    public void setHorasMaxClaseConsXDia(String horasMaxClaseConsXDia) {
        this.horasMaxClaseConsXDia = horasMaxClaseConsXDia;
    }

    public String getProbCruzamiento() {
        return probCruzamiento;
    }

    public void setProbCruzamiento(String probCruzamiento) {
        this.probCruzamiento = probCruzamiento;
    }

    public String getProbMutacion() {
        return probMutacion;
    }

    public void setProbMutacion(String probMutacion) {
        this.probMutacion = probMutacion;
    }

    public String getTamanoPoblacion() {
        return tamanoPoblacion;
    }

    public void setTamanoPoblacion(String tamanoPoblacion) {
        this.tamanoPoblacion = tamanoPoblacion;
    }

    public String getHorasMaxClaseTotalXDia() {
        return horasMaxClaseTotalXDia;
    }

    public void setHorasMaxClaseTotalXDia(String horasMaxClaseTotalXDia) {
        this.horasMaxClaseTotalXDia = horasMaxClaseTotalXDia;
    }
    
    
    
    
    
}
